#ifndef __M_HOT_H__
#define __M_HOT_H__

#include "data.hpp"
#include "util.hpp"
#include <string>
#include <vector>
#include <time.h>
#include <unistd.h>

extern Cloud::DataManage *_data; // 声明使用外部变量

namespace Cloud
{
    class HotManage
    {
    public:
        HotManage()
        {
            Config *pc = Config::GetInstance();

            _hot_time = pc->GetHotTime();
            _backfile_dir = pc->GetBackFileDir();
            _packfile_dir = pc->GetPackFileDir();

            // 需要确保目录存在
            FileUtil fuB(_backfile_dir);
            FileUtil fuP(_packfile_dir);

            fuB.CreateDirectory();
            fuP.CreateDirectory();
        }

        // 热点文件检测+管理
        bool RunModule()
        {
            while(true)
            {
                // 1.扫描备份文件目录中的文件
                std::vector<std::string> array;
                FileUtil fu(_backfile_dir);
                fu.ScanDirectory(&array);

                // 2.遍历备份文件
                for(auto &filepath : array)
                {
                    FileUtil fu(filepath);

                    // 先判断是否为热点文件
                    if(HotJudge(fu) == false)
                        continue;

                    // 3.从 _table 中获取当前文件的信息
                    BackedInfo info(filepath);
                    _data->GetOneByRealPath(filepath, &info); // ***修复重新下载的问题***

                    // 4.压缩文件至压缩目录中
                    fu.Compress(info.pack_path);
                    info.pack_flag = true;
                    _data->Update(info);

                    // 5.删除源文件
                    fu.Remove();
                }

                // 防止没有文件时 CPU 占用率高
                usleep(1000);
            }
        }

        bool HotJudge(FileUtil &fu)
        {
            time_t lastAccTime = fu.LastAccTime();
            time_t nowTime = time(nullptr);

            if(nowTime - lastAccTime > _hot_time)
                return true;
            
            return false;
        }

    private:
        int _hot_time; // 热点文件间隔时间（秒）
        std::string _backfile_dir; // 备份文件目录
        std::string _packfile_dir; // 压缩文件目录
        // std::string _packfile_suffix; // 压缩文件后缀
    };
}

#endif